OculusQuest 開発 スタートガイド
プロジェクト構築
Oculus Integrationのインポート
ビルド設定
Platform をAndroidに
Texture Compression をASTCに
Development Build のチェックを外す
プロジェクト設定ーPlayer
Minimum API Level をAndroid 6.0 Marshmallow に
Target API Level をAutomaticに
Install Location をAutomaticに
プロジェクト設定ーXR Plugin Management
Install XR Plugin Management を押す
Oculusを選択
デスクトップタブへ移動して、改めてOculusを選択
---
2022/10/24
UnityのOpenXRの仕様が変わってコントローラ回りが死んだくさいので、集約するのも考え物
OVRCameraRig について
所謂メインカメラプレハブ Assets/Oculus/VR/Prefab/OVRCameraRig.prefab
OVRCameraRigには大きく2つのスクリプトが添付されている。
OVRCameraRig.cs
ステレオレンダリングとヘッドトラッキングを司る
全てのカメラコントロールは、このコンポーネントを通して行う必要がある
OVRManager.cs
VRハードウェアへのメインインターフェース
トラッキングに関するオプションが設定できる
TrackingOriginType
EyeLevel : デバイスの位置を基準とした相対値として、位置と向きをトラッキング
FloorLevel : Oculus設定で指定された、ユーザーが立った状態の高さに基づいて、床を基準とした相対値として、位置と向きをトラッキング
AllowRecenter(再センタリングを許可)
プレイヤーの位置を戻す機能を許可するかどうか
コックピットなど、ユーザーが居るべき場所が固定されてるならTrue
ロコモーションがあるなど、ユーザーが居るべき場所が固定されていないなら(不正な場所へワープする可能性があるので)Falseが推奨
ColorGamut
Quest2ならRec709を使う
MixedRealityCapture
所謂MR機能。使うならタブ開いてenableする
コントローラについて
要件
SceneにOVRMangerがある事
何かのコンポーネントで、Update()でOVRInput.Update()とFixedUpdate()でOVRInput.FixedUpdate()を実行する事
Oculus Touchコントローラーは、OVRInput内ではPrimaryとSecondaryに区別されます。Primaryは常に左コントローラーを指し、Secondaryは常に右コントローラーを指します。
入力の状態は OVRInput.Get()OVRInput.GetDown()OVRInput.GetUp()で取得する。引数に入れるenumで種類を選べる。
Raw付きとRaw無しがあるが、Raw無しを使うのを推奨するのだそう。
table:ボタン押下には3段階ある
押した OVRInput.Button.XXXX
触った OVRInput.Touch.XXXX
近くに指がある OVRInput.NearTouch.XXXX
第2引数には、どのコントローラからの入力かを絞り込める。
基本的にはOVRInput.Controller.Touchで良い気がする
Touchコントローラを置いて、Xboxコントローラに持ち替えた時の事を想定している。
OVRInput.Controller.LTouch / .RTouchを使うと、第1引数のPrimary/Secondaryを打ち消すことが出来る。
enumと実際のコントローラとのマッピングは、上のURLを参照
コントローラのモデル
Assets/Oculus/VR/Meshesにコントローラの3Dモデルが同梱されている。
Meshファイルに、各ボタンが押下された時のアニメーションも保存されている。
利用する時は、Assets/Oculus/VR/Prefabs/OVRControllerPrefabを持ってくると、セットアップ済みなので楽ちん
このプレハブの詳細は OVRControllerHelper.csを読む
ランタイムコントローラー
使用中のコントローラと一致するコントローラーモデルを、動的に読み出す機能
OVRRuntimeControllerPrefabをLeft/RightControllerAnchorの中に入れて使う。
詳しい使い方は上記URL
ハンドトラッキング
基本的には、OVRManagerのHand Tracking Supportをオンにして、各HandAnchorにOVRHandPrefabを入れれば良い。
物理カプセルの追加の記事が間違えてる
正しくは、Enable Physics Capsulesにチェックを入れる
手のモデルの変更については結構大変そう
自分でカスタマイズしたメッシュを使用して好みの手をレンダリングするには、Oculusの骨組みで駆動するカスタムの骨組みをマッピングします。使用例の詳細については、OVRCustomHandPrefab_LおよびOVRCustomHandPrefab_Rのprefabと、OVRCustomSkeleton.csスクリプトを使用するHandTest_Customシーンを参照してください。
ピンチの検出
OKサインみたいな指の形。デジタルな入力に使う。
OVRHandコンポーネントのGetFingerIsPinching()GetFingerPinchStrength()でピンチしてるかどうかを拾える。
GetFingerPinchStrength()は、ピンチ具合。0~1の値で、指が完全にくっついたら1
PointerPoseプロパティを使う事で、ピンチの向きが取れる
IsTrackedプロパティで手をトラッキングしてるかどうかわかる。トラッキングの信頼性はHandConfidenceプロパティで取得できる。
HandConfidenceは、HighかLowで返して来る。Highの場合のみ利用する事を推奨なのだそう
システムジェスチャの検出
Oculusボタンの役割をするジェスチャ
利き手側の場合は予約済動作なので触れない。
利き手じゃない方の場合、Button.Startイベントがトリガされる
システムジェスチャ実施中かどうかを、IsSystemGestureInProgressプロパティで拾える
つかむ、つつく、レイキャストするなどが出来るSDKらしい
スタートガイドが死んでて何もわからないので一旦飛ばし
トラッキングキーボードSDK
物理キーボードの場所を表示する奴
あんま興味ないので飛ばし
ボイスSDK
アプリのビルドと実行
プラットフォームの選択
シーンの追加
VRサポート、レンダリング設定
ビルドの生成
デバッグ用のビルド
Unityが2020.3 LTSであること、Windows開発機であることを前提に、デバッグ用の簡易ビルドツールが使える
OVR Build APK
Oculus -> OVR Build -> OVR Build APKから実行できる
そのまま実行したければ、OVR Build APK & Runを使う
OVR Quick Scene Preview
AssetBundleを利用した簡易ビルドOculus->OVR Build -> OVR Scene Quick Previewから呼び出す
1. 始めにBuild and Deploy Appを押す
2. シーンを追加するには Open Build Settingsから行う。シーンの遷移はインデックス番号だと動作しないので、シーン名で行う必要がある
3. シーンをデバイスにビルドするには、Build and Deploy Scene(s)を押す。
そのほか色々ユーティリティがある
他、Oculusストアへのアップロード方法など
パッケージの機能
FixedFoveatedRendering(FFR)
人間の目は、視野の端っこは解像度が低いので、それに合わせて描画処理も端っこは解像度落としてパフォーマンス改善する機能。
これはFixed(固定)なので、眼球動かすと解像度落ちてるのバレるのであまり良いものではない
リフレッシュレートの調整
OVRPlugin.systemDisplayFrequency = 90.0f;によって、HMDのリフレッシュレートを変える事が出来る。
上げたものの、熱暴走などで勝手に下げる事はある(動的スロットリング)
下がったかどうかはイベントが発火するのでハンドリングできる
フェーズ同期
雑に、FPSが改善する技術だと思えばよい。動的FPSになる。
ProjectSettingsのPhaseSyncにチェックを入れると有効化される
VRコンポジターレイヤー
え、ええと。。。?
動画再生に使える技術らしい
読み込み中画面に使える技術らしい
詳細については、SampleFrameworkフォルダーのOVROverlayサンプルを開いてください。
シングルパスステレオレンダリングと、ステレオインスタンス
シングルパスステレオレンダリングを利用すると、オブジェクトはまず左のアイバッファにレンダリングされた後、頂点位置と反射などの視覚依存変数に適切な変更が加えられて、自動的に右のバッファへ複製されます。これにより主としてCPU使用率が削減され、GPUパフォーマンスはほとんど変化しません。CPUバウンドまたはドローコールバウンドのアプリを作成している場合には、パフォーマンスの向上のためにシングルパスステレオレンダリングの使用を強くおすすめします。
要するにシングルパスステレオレンダリングにした方が(CPUが)軽いらしい。
けど、カメラ1個しか使わないから、片目にだけ描画を変えるとかは出来ないし、多分視差マッピングも上手くいかない?
OpenGLとかではこのことをマルチビューと呼ぶ
色空間の設定
カレントとデフォルトがある
var currentColorSpace = OVRManager.colorGamut;
var defaultColorSpace = OVRManager.nativeColorGamut;
色空間の設定もできる
OVRManager.colorGamut = OVRManager.ColorSpace.Rec_2020;
どの色空間にすればよいのか?
このガイドの技術的なポイントを要約すると、次のようになります。
カラー スペースとして Rift CV1 を使用します。
とはいえ業界標準ではないので、知識があるならなんかした方が良い
これは、Quest1に配慮しろと言っている
Rec.709 (sRGB) を色空間として選択しないでください。その方がより正確だと思われる場合でも同様です。その場合、Quest 1 またはその他の広色域ディスプレイ HMD で実行されている VR アプリは、ディスプレイが表示できるより飽和した色をターゲットにすることができず、色あせが生じます。
VulkanAPIの既知の問題
今の所使うつもりはないので飛ばす
非対称FOVに関するよくある質問
非対称FOVとは
右目と左目で、FOVを計算する中心がズレる事。普通のディスプレイなら中央基準で良かった。
画質を落とす事無く、描画ドットを2割くらい減らせる
フラグメントシェーダの性能が良くなる(実行回数が減る
デバイス座標(NDC)における数値と位置の対応関係が、(中心がズレるため)変わってしまう。
中心位置の算出は $ ProjectionMatrix * (0, 0, -zNear, 1)
ヴィネットポストエフェクト(画面端が暗くなるやつ)で顕著
アプリスペースワープ開発者ガイド
パフォーマンス改善機能
一部の描画情報を1フレームで2フレーム分作成する事で、描画FPSを維持しながら処理FPSを減らす
ちゃんと使わないと、描画が揺れたり途切れたりする
UnityだとURPが必要になる
かなり難易度が高い
フォーカス検知
OculusのシステムUIを呼び出した事(右手のOculusボタン押下)を検出する
フォーカスを失った時 OVRManager.InputFocusLostが発火する
フォーカスを獲た時 OVRManager.InputFOcusAcquiredが発火する
キーボードオーバーレイ
仮想キーボードを出す機能
UIのTextInputを使うなら使う
UnityのOculus Dash
PCVRの時に、右手のOculusボタン押した時の話。
デフォルトだと、Questと違って空間が切り替わるので、それが嫌ならこれに対応する必要がある
インスタントランタイムスプラッシュスクリーン
OVRCameraRigに、スプラッシュスクリーン画像を登録できる。
アプリ起動直後にロードされるので、高速でスプラッシュスクリーンを出せるのが特徴
アプリのライフサイクル処理
以下のようなカテゴリがある
アプリ開始
HMDを外したり付けたり
HMDを外して、しばらくしてから付ける
HMDがガーディアンの外に出たり戻ったり
電源ボタンが押されてスリーブしたり戻ったり
Oculusボタンが押されてフォーカスを失ったり獲たり
OnApplicationFocusやOnApplicationPauseで大部分に対応できる
複合現実キャプチャ
現在(2022/11)開発中
通称MRC。VR映像の中に、遊んでる人を合成するアレの事。CMに良い
MRCの実装例としてOculus/VR/Scenes/MRC.unityが提供されています。
ミラーリング用の観客カメラ
MRCを使って第3者向けのカメラを作る
キューブマップのスクリーンショット
OVRCubemapCaptureProbeを使って、360°スクショが出来る
HMDモーションエミュレーション
実はエディタPlayでHMDの位置を操作できる
Questの場合、LinkでPCVR状態にしないと作動しない
物を持つサンプル
複合現実
概要
基本的な使い方
OVRCameraRigのPassthroughCapabilityEnabled、Insight Passthrooughを有効にする。
OVRPassthroughLayerコンポーネントを追加する
Compositing/PlacementをUnderlayにする
CenterEyeAnchorのカメラで、ClearFlagsをSolidColorに、色を黒に、アルファ0にする。
"背景”になる所が、ビデオパススルーの映像になる
ちなみに、QculusLinkを使った、UnityPlayerからの実行ではビデオパススルーが動作しない。テストするには実機にインストールする必要がある
周囲確認のカスタマイズ
透明度の変更
エッジレンダリング(境界線のみ表示)
エッジの色を指定できる
パススルー画像の色変更
明度とコントラスト
グレースケール
グレースケールに色を乗せる(セピア調とか)
これらの調整は、OVRPassthroughLayerコンポーネントからアクセスできる
SetColorMapで、色の対応変更(色の反転とか)も出来る
SetColorMapMonochromatic:輝度版
SetColorMapControls:色to色変換
SetBrightnessContrastSaturation:明度とコントラストを調整する色マップ
これらは排他的に動作する
ユースケース
/周囲確認AR
アプリの背景としてパススルーを使う
やり方
OVRPassthroughLayerのPlacementをUnderlayにする
CenterEyeAnchorのカメラで、ClearFlagをSolidColorに、背景色は黒、アルファ0にする
/オクルージョン
シェーダを使って、部分的にパススルーを表示して、VRオブジェクトの手前に現実の手を表現したり出来る。
Oculus/SampleFramework/Usage/Passthrough/Scenes/PassthroughHands.sceneなんかにサンプルがある
・・・が、ビルド出来ない!
Shader error in 'MixedReality/SelectivePassthroughSoft': undeclared identifier 'sampler_CameraDepthTexture' at line 55 (on gles3)
/周囲確認ウィンドウ
パススルーしつつ、スカイボックスを使いたい時向けの機能
フレームバッファにアルファ0を書き込むシェーダを用意する事で、現実を見る窓のような物を作れる
アルファが1以下の場合、ブレンドされる。
ブレンドモードは以下の様にしないといけないらしい
code:shader
BlendOp RevSub
Blend Zero One, One One
また、OVRManager.eyeFovPremultipliedAlphaModeEnabled = false;を設定しなければいけない
/サーフェス投影周囲確認
周囲確認画像の投影先のジオメトリを指定することができる
このテクニックは、平らな机や壁画など、VRのジオメトリが実世界と一致する、信頼性の高い状況でのみ使用するようにしてください。ジオメトリが実世界と大幅に異なる場合、ユーザーにとって奥行きのキューが競合するものとなり、物体があまりに小さいかあまりに大きく見えてしまうことがあります。
仮想の窓を作って、現実を見る用途には使えない(その場合周囲確認ウィンドウのアプローチをとる
OculusLinkによる周囲確認
事前準備
PCのOculusアプリの設定→ベータから、"Oculus Link経由での周囲確認"を有効にする
Questを、有線Linkの方でPCVRに入る
ベストプラクティス
周囲確認機能をオンオフする
OVRPassthroughLayer::enabled
またはOVRManager.isInsightPassthroughEnabled
関連オブジェクトをすべて破棄するので、長時間使わない場合に使う
使用されていない周囲確認レイヤーを非表示にする
OVRPassthroughLayer::hidden
7MBくらいGPUが安くなる
周囲確認レイヤー数を最小限にする
サーフェス投射周囲確認を使って、再構築の悪影響を回避する
わからん・・・
シーン
UnityのSceneと言うより、プレイヤーの物理空間とのやり取りの話
シーンキャプチャ
シーンモデルを生成できるようにする前準備
シーンモデル
Questに登録した部屋の情報。床や壁、ソファや机など
The WorldBeyondサンプルアプリがやってる事がそれ
OVRManagerの"アンカーサポート"を有効にすると使える
うーん、わかんねぇ
空間アンカー
物理空間と紐づいた座標(点)を作る技術。この点との相対位置にゲームオブジェクトを配置する事で、それを物理空間に固定出来る。
ゲームオブジェクトは、空間アンカーから3m以上離すと、誤差が目立ち始めるらしい
アンカーとオブジェクトの紐づけは、親子関係にする形になる。
この機能も、OVRManagerのアンカーサポート(Anchor Support)を有効にすると使える
アンカーのコンポーネントは、取り付けた状態でSceneにおいてもダメで、必要になった時に適宜 AddComponent<OVRSpatialAnchor>()する。
アンカーの物理座標はHMD筐体に保存できるのがウリ
テストとパフォーマンス分析
VR視点と、非VR視点を切り替えられるようにすると、調査が楽になるらしい。
デバッグ中はPlayerSettings->Multithreaded Renderingを無効にすると、表示が見やすくなるらしい。
パフォーマンスのターゲット値
FPSが最低でも72を維持する事
ドローコールは200以下を目安に。軽いアプリなら600くらいまで耐えられる
ポリゴン数は70万ポリゴン以下を目安に
プロファイリングツールの紹介
Unity標準プロファイラ
レンダリング統計
GPUオーバードローの表示
Unityフレームデバッガー
Unityビルトインプロファイラ
Unityプロファイラ―
TODO:性能改善チェックシート
MovementSDK
ボディ、フェイス、アイのトラッキングSDK
用語メモ
XRコンポジター
Unityが作った絵を、両眼HMD向けに加工する層。たぶん。
VRコンポジターレイヤーや、アプリスペースワープに絡む話
パススルーも、この層で合成される